package com.zhumo.sz.gaode;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.zhumo.sz.common.utils.EnumUtil;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author  jiqqi.zhu
 * @time 2024-03-03
 * @comment  解析Poi
 */

public class PoiParser {

    /**
     * 解析 Poi 根据传入的结果对所有poi结果进行划分 传入一个jsonObject 数组
     * 遍历数组 -> 每获取一个值 获取type -> 检查map中是否有key 如果有 获取对应 list 并加入
      -> 没有 创建list 加入进去 即可
     * 获取
     */
    public static HashMap<String, ArrayList<Poi>>  parseGaodeResponse(JSONArray poiArray){
        //获取所有的类型 动态生成数组 需要一个tmp 数组 m * n 次
        HashMap<String, ArrayList<Poi>> parseRecord = new HashMap<>();
        ArrayList<Poi> temp = new ArrayList<>();
        poiArray.stream().map(data -> JSONObject.parseObject(JSON.toJSONString(data))).forEach(
                jsonObject -> {
                    String[] typeList = jsonObject.getString("type").split(";");
                    String firstType = typeList[0];
                    Poi poi = Poi.init(jsonObject);
                    if (Objects.isNull(parseRecord.get(firstType))){
                        ArrayList<Poi> poiList = new ArrayList<>();
                        poiList.add(poi);
                        parseRecord.put(firstType,poiList);
                    }else {
                        ArrayList<Poi> poiList = parseRecord.get(firstType);
                        poiList.add(poi);
                        parseRecord.put(firstType,poiList);
                    }
                }
        );
        return parseRecord;
    }


    /**
     * 筛选poi 用于写入Mysql
     * @param poiMap poi集合
     * @param type 目标种类
     * @return str
     */
    public static String classifyPoi(HashMap<String,ArrayList<Poi>> poiMap,String type){
        if (Objects.isNull(poiMap) || poiMap.size()  == 0){
            return "";
        }
        Set<String> types = Arrays.stream(FirstPoiType.values())
                .map(FirstPoiType::getValue).collect(Collectors.toSet());
        if (!types.contains(type)){
            return "";
        }
        List<Poi> poiList = poiMap.get(type);
        if (Objects.isNull(poiList) || poiList.size() == 0){
            return "";
        }
        JSONObject jsonObject = new JSONObject();
        try {
            for (Poi poi : poiList) {
                //赋值
                String id = poi.getId();
                JSONObject son = JSONObject.parseObject(JSON.toJSONString(poi));
                jsonObject.put(id,son);
            }
        }catch (JSONException e){
            e.printStackTrace();
            return "";
        }
        return jsonObject.toJSONString();
    }


    /**
     * Poi归档
     * 根据poi结果 和 选择的poi级别 返回对应的 poi结果
     * first second third 目前有三级poi可以归档
     * 根据高德的解析结果 传入想要转换的poi类型
     * PoiType：此枚举中包含了所有poi标签 定义标准 每个Poi 中必须携带其标签枚举属性
     * 传递示例: 高德的map ， FirstPoi.class return 补充好的FirstPoi
     * 逻辑：如何将属性与类型相对应
     */
    public static <T extends BasePoi<String>> T filePoi(HashMap<String,ArrayList<Poi>> gaoDeResponse,Class<?> type) {
//        List<EnumUtil.EnumsInfo<Object>> enumsInfos = EnumUtil.getEnumInfo(type);
        //todo 先取第一个 后续修改
//        EnumUtil.EnumsInfo<Object> enumsInfo = enumsInfos.get(0);
        Object obj = null;
        try {
            obj = type.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        Field[] fields = type.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldName = field.getName();
            PoiModelProperty annotation = field.getAnnotation(PoiModelProperty.class);
            if (Objects.nonNull(annotation)){
                String value = annotation.value();
                String str = classifyPoi(gaoDeResponse, value);
                try {
                    field.set(obj,str);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return (T) obj;
    }


//    public static void main(String[] args) {
//        classifyPoi(null,null);
//    }
}
